gdk/gdkscreen.h gdk/x11/gdkscreen-x11.c added
authorMichael Natterer <mitch@imendio.com>
Wed, 8 Mar 2006 17:02:34 +0000 (17:02 +0000)
committerMichael Natterer <mitch@src.gnome.org>
Wed, 8 Mar 2006 17:02:34 +0000 (17:02 +0000)
2006-03-08  Michael Natterer  <mitch@imendio.com>

* gdk/gdkscreen.h
* gdk/x11/gdkscreen-x11.c
* gdk/gdk.symbols: added gdk_screen_get_active_window() and
gdk_screen_get_window_stack() (patch from maemo-gtk).
Fixes bug #320881.

* gdk/directfb/gdkscreen-directfb.c
* gdk/quartz/gdkscreen-quartz.c
* gdk/win32/gdkscreen-win32.c: added the functions as stubs.

ChangeLog
ChangeLog.pre-2-10
gdk/directfb/gdkscreen-directfb.c
gdk/gdk.symbols
gdk/gdkscreen.h
gdk/quartz/gdkscreen-quartz.c
gdk/win32/gdkscreen-win32.c
gdk/x11/gdkscreen-x11.c

index 98237a68da3f76669810e74c0bcb152e58910188..d80e3be0fb7d7911b92d3901003aeb0f19329c64 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2006-03-08  Michael Natterer  <mitch@imendio.com>
+
+       * gdk/gdkscreen.h
+       * gdk/x11/gdkscreen-x11.c
+       * gdk/gdk.symbols: added gdk_screen_get_active_window() and
+       gdk_screen_get_window_stack() (patch from maemo-gtk).
+       Fixes bug #320881.
+
+       * gdk/directfb/gdkscreen-directfb.c
+       * gdk/quartz/gdkscreen-quartz.c
+       * gdk/win32/gdkscreen-win32.c: added the functions as stubs.
+
 2006-03-08  Michael Natterer  <mitch@imendio.com>
 
        * tests/prop-editor.c (unichar_changed): zero-initialize the
index 98237a68da3f76669810e74c0bcb152e58910188..d80e3be0fb7d7911b92d3901003aeb0f19329c64 100644 (file)
@@ -1,3 +1,15 @@
+2006-03-08  Michael Natterer  <mitch@imendio.com>
+
+       * gdk/gdkscreen.h
+       * gdk/x11/gdkscreen-x11.c
+       * gdk/gdk.symbols: added gdk_screen_get_active_window() and
+       gdk_screen_get_window_stack() (patch from maemo-gtk).
+       Fixes bug #320881.
+
+       * gdk/directfb/gdkscreen-directfb.c
+       * gdk/quartz/gdkscreen-quartz.c
+       * gdk/win32/gdkscreen-win32.c: added the functions as stubs.
+
 2006-03-08  Michael Natterer  <mitch@imendio.com>
 
        * tests/prop-editor.c (unichar_changed): zero-initialize the
index a18cc2c1f4a09402463ad89fa2eedf1483aba302..5eb1384bd41c61714f6f9b295eb5b03c3a4d8205 100644 (file)
@@ -196,6 +196,21 @@ gdk_screen_get_rgba_colormap (GdkScreen *screen)
   return rgba_colormap;
 }
 
+GdkWindow *
+gdk_screen_get_active_window (GdkScreen *screen)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return NULL;
+}
+
+GList *
+gdk_screen_get_window_stack (GdkScreen *screen)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return NULL;
+}
 
 
 #define __GDK_SCREEN_X11_C__
index c628388e0823d0fc6387ef0f124327b77b5d50a5..9f381a5e6e66e31dfa99d8ff4fb8b6e7cdcf262e 100644 (file)
@@ -1039,6 +1039,8 @@ gdk_screen_get_n_monitors
 gdk_screen_get_monitor_geometry
 gdk_screen_get_rgba_colormap
 gdk_screen_get_rgba_visual
+gdk_screen_get_active_window
+gdk_screen_get_window_stack
 gdk_screen_make_display_name
 #endif
 #endif
index 620fca71ce9ac0817ecb81d4d2324be55b6650a6..3b6624b687d138731742a65f0815ccd974f351fe 100644 (file)
@@ -110,6 +110,9 @@ void    gdk_screen_set_resolution (GdkScreen *screen,
                                   gdouble    dpi);
 gdouble gdk_screen_get_resolution (GdkScreen *screen);
 
+GdkWindow *gdk_screen_get_active_window (GdkScreen *screen);
+GList     *gdk_screen_get_window_stack  (GdkScreen *screen);
+
 G_END_DECLS
 
 #endif                         /* __GDK_SCREEN_H__ */
index f23eba227e027ea659cdc54d754f533f712a34b4..3aadebd06366540de2ac95be07b38d4e7c299a5d 100644 (file)
@@ -239,3 +239,19 @@ gdk_screen_make_display_name (GdkScreen *screen)
 {
   return g_strdup (gdk_display_get_name (_gdk_display));
 }
+
+GdkWindow *
+gdk_screen_get_active_window (GdkScreen *screen)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return NULL;
+}
+
+GList *
+gdk_screen_get_window_stack (GdkScreen *screen)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return NULL;
+}
index 24a309410350f6e41df64ffe0bc7b19607711bc6..0bf47e3dcfe7c78159d775ba9f5429762e16ceaa 100644 (file)
@@ -117,3 +117,19 @@ gdk_screen_make_display_name (GdkScreen *screen)
 {
   return g_strdup (gdk_display_get_name (_gdk_display));
 }
+
+GdkWindow *
+gdk_screen_get_active_window (GdkScreen *screen)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return NULL;
+}
+
+GList *
+gdk_screen_get_window_stack (GdkScreen *screen)
+{
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  return NULL;
+}
index 63a69ae6323f1272b0cdf860bf62e13076a5826c..f9cfc8cdb847370199bb0e8c098d7edb09bec37a 100644 (file)
@@ -791,5 +791,149 @@ gdk_screen_make_display_name (GdkScreen *screen)
                                                  gdk_screen_get_number (screen));
 }
 
+/**
+ * gdk_screen_get_active_window
+ * @screen: a #GdkScreen
+ *
+ * Returns the screen's currently active window.
+ *
+ * On X11, this is done by inspecting the _NET_ACTIVE_WINDOW property
+ * on the root window, as described in the <ulink
+ * url="http://www.freedesktop.org/Standards/wm-spec">Extended Window
+ * Manager Hints</ulink>. If there is no currently currently active
+ * window, or the window manager does not support the
+ * _NET_ACTIVE_WINDOW hint, this function returns %NULL.
+ *
+ * On other platforms, this function may return %NULL, depending on whether
+ * it is implementable on that platform.
+ *
+ * The returned window should be unrefed using g_object_unref() when
+ * no longer needed.
+ *
+ * Return value: the currently active window, or %NULL.
+ *
+ * Since: 2.10
+ **/
+GdkWindow *
+gdk_screen_get_active_window (GdkScreen *screen)
+{
+  GdkScreenX11 *screen_x11;
+  GdkWindow *ret = NULL;
+  Atom type_return;
+  gint format_return;
+  gulong nitems_return;
+  gulong bytes_after_return;
+  guchar *data = NULL;
+
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  if (!gdk_x11_screen_supports_net_wm_hint (screen,
+                                            gdk_atom_intern_static_string ("_NET_ACTIVE_WINDOW")))
+    return NULL;
+
+  screen_x11 = GDK_SCREEN_X11 (screen);
+
+  if (XGetWindowProperty (screen_x11->xdisplay, screen_x11->xroot_window,
+                         gdk_x11_get_xatom_by_name_for_display (screen_x11->display,
+                                                                "_NET_ACTIVE_WINDOW"),
+                         0, 1, False, XA_WINDOW, &type_return,
+                         &format_return, &nitems_return,
+                          &bytes_after_return, &data)
+      == Success)
+    {
+      if ((type_return == XA_WINDOW) && (format_return == 32) && (data))
+        {
+          GdkNativeWindow window = *(GdkNativeWindow *) data;
+
+          if (window != None)
+            {
+              ret = gdk_window_foreign_new_for_display (screen_x11->display,
+                                                        *(GdkNativeWindow *) data);
+            }
+        }
+    }
+
+  if (data)
+    XFree (data);
+
+  return ret;
+}
+
+/**
+ * gdk_screen_get_window_stack
+ * @screen: a #GdkScreen
+ *
+ * Returns a #GList of #GdkWindow<!-- -->s representing the current
+ * window stack.
+ *
+ * On X11, this is done by inspecting the _NET_CLIENT_LIST_STACKING
+ * property on the root window, as described in the <ulink
+ * url="http://www.freedesktop.org/Standards/wm-spec">Extended Window
+ * Manager Hints</ulink>. If the window manager does not support the
+ * _NET_CLIENT_LIST_STACKING hint, this function returns %NULL.
+ *
+ * On other platforms, this function may return %NULL, depending on whether
+ * it is implementable on that platform.
+ *
+ * The returned list is newly allocated and owns references to the
+ * windows it contains, so it should be freed using g_list_free() and
+ * its windows unrefed using g_object_unref() when no longer needed.
+ *
+ * Return value: a list of #GdkWindow<!-- -->s for the current window stack,
+ *               or %NULL.
+ *
+ * Since: 2.10
+ **/
+GList *
+gdk_screen_get_window_stack (GdkScreen *screen)
+{
+  GdkScreenX11 *screen_x11;
+  GList *ret = NULL;
+  Atom type_return;
+  gint format_return;
+  gulong nitems_return;
+  gulong bytes_after_return;
+  guchar *data = NULL;
+
+  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  if (!gdk_x11_screen_supports_net_wm_hint (screen,
+                                            gdk_atom_intern_static_string ("_NET_CLIENT_LIST_STACKING")))
+    return NULL;
+
+  screen_x11 = GDK_SCREEN_X11 (screen);
+
+  if (XGetWindowProperty (screen_x11->xdisplay, screen_x11->xroot_window,
+                         gdk_x11_get_xatom_by_name_for_display (screen_x11->display,
+                                                                "_NET_CLIENT_LIST_STACKING"),
+                         0, G_MAXLONG, False, XA_WINDOW, &type_return,
+                         &format_return, &nitems_return,
+                          &bytes_after_return, &data)
+      == Success)
+    {
+      if ((type_return == XA_WINDOW) && (format_return == 32) &&
+          (data) && (nitems_return > 0))
+        {
+          GdkNativeWindow *stack = (GdkNativeWindow *) data;
+          GdkWindow *win;
+          int i;
+
+          for (i = 0; i < nitems_return; i++)
+            {
+              win = gdk_window_foreign_new_for_display (screen_x11->display,
+                                                        stack[i]);
+
+              if (win != NULL)
+                ret = g_list_append (ret, win);
+            }
+        }
+    }
+
+  if (data)
+    XFree (data);
+
+  return ret;
+}
+
 #define __GDK_SCREEN_X11_C__
 #include "gdkaliasdef.c"